gtkstack: reorder size_allocate and move_window
authorOlivier Fourdan <ofourdan@redhat.com>
Wed, 2 Nov 2016 09:08:17 +0000 (10:08 +0100)
committerOlivier Fourdan <ofourdan@redhat.com>
Mon, 14 Nov 2016 11:24:18 +0000 (12:24 +0100)
Unlike other container widgets, GtkStack would allocate its children
prior to moving its windows, which might prevent further valid size
allocation signals to be emitted.

Re-order the size allocation of child widgets to be performed after
moving the GtkStack windows.

Thanks to Owen for spotting the real issue here.

https://bugzilla.gnome.org/show_bug.cgi?id=767713

gtk/gtkstack.c

index 741671818429532f8854cea4818790b723e50ca9..22a10996caa4225286c1042602fa9100cb31da36 100644 (file)
@@ -2226,6 +2226,15 @@ gtk_stack_allocate (GtkCssGadget        *gadget,
   child_allocation.x = 0;
   child_allocation.y = 0;
 
+  if (gtk_widget_get_realized (widget))
+    {
+      gdk_window_move_resize (priv->view_window,
+                              allocation->x, allocation->y,
+                              allocation->width, allocation->height);
+      gdk_window_move_resize (priv->bin_window,
+                              get_bin_window_x (stack, allocation), get_bin_window_y (stack, allocation),
+                              allocation->width, allocation->height);
+    }
 
   if (priv->last_visible_child)
     {
@@ -2288,17 +2297,6 @@ gtk_stack_allocate (GtkCssGadget        *gadget,
 
       gtk_widget_size_allocate (priv->visible_child->widget, &child_allocation);
     }
-
-   if (gtk_widget_get_realized (widget))
-    {
-      gdk_window_move_resize (priv->view_window,
-                              allocation->x, allocation->y,
-                              allocation->width, allocation->height);
-      gdk_window_move_resize (priv->bin_window,
-                              get_bin_window_x (stack, allocation), get_bin_window_y (stack, allocation),
-                              allocation->width, allocation->height);
-    }
-
   gtk_container_get_children_clip (GTK_CONTAINER (widget), out_clip);
 }
 static void